#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

using namespace std;

// 验证主进程调用子进程时，子进程出现coredump，使用gdb调试时需要传递子进程可执行文件名（注意，需要传递的可执行文件原始字符串）
// 当前代码先fork子进程，然后在子进程中执行../so.out，子进程出现coredump时，正确调试命令为：gdb ../so.out [coredump文件名]
// 这样是错误的：gdb so.out [coredump文件名]，执行bt时，堆栈信息是??形式。
int main() {
    pid_t pid = fork();
 
    if (pid == -1) {
        // 错误处理
        std::cerr << "Fork failed." << std::endl;
        return -1;
    } else if (pid > 0) {
        // 父进程
        int status;
        cout << "父进程等待子进程结束..." << endl;
        waitpid(pid, &status, 0); // 等待子进程结束
    } else {
        // 子进程
        const char* program = "../so.out"; // 替换为你的可执行文件路径
        char* const argv[] = {const_cast<char*>(program), nullptr};
        execv(program, argv); // 调用可执行文件
 
        // 如果execv返回，则说明执行失败
        std::cerr << "Executing the program failed." << std::endl;
        _exit(1); // 使用_exit立即退出，而不经过清理程序
    }
 
    return 0;
}